package br.com.faculdade.application.controller;

import br.com.faculdade.domain.service.HospedeService;
import br.com.faculdade.infrastructure.entity.Hospede;
import java.util.List;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Begin;
import org.jboss.seam.annotations.Create;
import org.jboss.seam.annotations.End;
import org.jboss.seam.annotations.FlushModeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.datamodel.DataModel;
import org.jboss.seam.annotations.datamodel.DataModelSelection;
import org.jboss.seam.log.Log;

/**
 *
 * @author Kirmaier
 */
@Scope(ScopeType.SESSION)
@Name("hospedeAction")
public class HospedeController extends BaseController {

    @Logger
    private Log log;
    //Injeção dos services
    @In
    private HospedeService hospedeService;
    //Objeto para CRUD
    private Hospede hospede;
    @DataModel("hospedes")
    private List<Hospede> hospedesDM;
    @DataModelSelection("hospedes")
    private Hospede hospedeSelecionado;
    //Regras para criação e alteração
    private Operacao operacaoAtual;
    //Atributos, parametros de pesquisa
    private String paramNome;
    private String paramCPF;
    //Regras de navegação para este controller
    private static final String CADASTRO_ALTERAR = "criar_alterar_hospede";
    private static final String CANCELAR = "cancelar_hospede";
    private static final String HOSPEDE = "hospede";

    @Create
    public String setup() {
        paramCPF = null;
        paramNome = null;

        hospedesDM = null;
        hospede = null;

        return HOSPEDE;
    }

    @Begin(join = true)
    public String criarSetup() {
        operacaoAtual = Operacao.CRIACAO;

        hospede = hospedeService.criar();

        return CADASTRO_ALTERAR;
    }

    @End
    public String criar() {
        try {
            hospedeService.salvar(hospede);

            adicionarMensagemInformacao("msgHospedeCriarSucesso");

            pesquisar();

            return HOSPEDE;
        } catch (Exception e) {
            log.error(e);

            adicionarMensagemErro("msgHospedeCriarErro");
        }
        return HOSPEDE;
    }

    @Begin(flushMode = FlushModeType.MANUAL, join = true)
    public String alterarSetup() {
        operacaoAtual = Operacao.ALTERACAO;

        hospede = hospedeService.obterPorId(hospedeSelecionado.getIdhospede());

        return CADASTRO_ALTERAR;
    }

    @End
    public String alterar() {
        try {
            hospedeService.alterar(hospede);

            adicionarMensagemInformacao("msgHospedeAlterarSucesso");

            pesquisar();

            return HOSPEDE;
        } catch (Exception e) {
            log.error(e);

            adicionarMensagemErro("msgHospedeAlterarErro");
        }
        return HOSPEDE;
    }

    public String excluir() {
        hospede = hospedeService.obterPorId(hospedeSelecionado.getIdhospede());
        try {
            hospedeService.excluir(hospede);

            adicionarMensagemInformacao("msgHospedeExcluirSucesso");

            pesquisar();
        } catch (Exception e) {
            log.error(e);

            adicionarMensagemErro("msgHospedeExcluirErro");
        }
        return null;
    }

    @End
    public String cancelar() {
        if (operacaoAtual == Operacao.ALTERACAO || operacaoAtual == Operacao.DETALHAMENTO) {
            hospedeService.cancelar();
        }
        return CANCELAR;
    }

    public void pesquisar() {
        hospedesDM = hospedeService.obterPorParametros(paramNome, paramCPF);
    }

    public void detalhar() {
        hospede = hospedeSelecionado;
    }

    //<editor-fold defaultstate="collapsed" desc="GETters e SETters">
    public Hospede getHospede() {
        return hospede;
    }

    public void setHospede(Hospede hospede) {
        this.hospede = hospede;
    }

    public String getParamCPF() {
        return paramCPF;
    }

    public void setParamCPF(String paramCPF) {
        this.paramCPF = paramCPF;
    }

    public String getParamNome() {
        return paramNome;
    }

    public void setParamNome(String paramNome) {
        this.paramNome = paramNome;
    }

    public Operacao getOperacaoAtual() {
        return operacaoAtual;
    }

    public void setOperacaoAtual(Operacao operacaoAtual) {
        this.operacaoAtual = operacaoAtual;
    }
    //</editor-fold>
}
